package n13_reentrantlock;

import lombok.extern.slf4j.Slf4j;
import utils.Sleeper;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author fu
 * @date 2022-01-08 18:18
 * 概要：
 * -----------------------------------------------------------------
 * |                                                               |
 * |           测试 Renntrantlock的 可打断(让等待终止获取锁失败) 方法   |
 * |                                                               |
 * |================================================================
 */
@Slf4j(topic = "c.T2")
public class T2_reentrantlock_可打断_被动 {

    private static ReentrantLock lock =  new ReentrantLock();


    public static void main(String[] args) {

        Thread t1 = new Thread(()->{

            /**
             * lock() 是不可打断的，要使用lockInterruptibly()
             * 如果没有竞争 获取lock对象锁 ；
             * 有竞争进入阻塞队列 可以被其他线程 interrupt打断(抛异常InterruptedException )不再继续等
             */
            try {
                log.debug("TTTTT 尝试。。。");
                lock.lockInterruptibly();    // lock被其他线程使用时，这里会 [阻塞等待]
            } catch (InterruptedException e) {
                e.printStackTrace();
                log.debug("XXXXX 没有获得锁");
                return;
            }

            try {
                log.debug("VVVVV 获取到锁！");
            } finally {
                lock.unlock();
            }

        }, "t1");


        // 如果有竞争，则 [t1线程] 进入阻塞
        lock.lock();
        t1.start();


        // 5 秒后 打断 t1
        Thread t2 = new Thread(()->{
            Sleeper.sleep(5);
            log.debug("------- [5秒后] --- t2 打断 t1线程");
            t1.interrupt();
        },"t2");

        t2.start();

    }











}
